package com.xueqiu.movieplaymanagersystem.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xueqiu
 */
@Configuration
@Data
public class DruidConfig {
    @Value("${druidPage.loginUsername}")
    private String loginUsername;
    @Value("${druidPage.loginPassword}")
    private String loginPassword;

    /**
     * 数据库连接池，读取yml配置
     *
     * @return druidDataSource对象
     */
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource();
    }

    /**
     * 这段代码是用于将Druid监控页面集成到Spring Boot应用中的。具体来说：
     * - @Bean是一个注解，用于标识该方法返回一个由Spring IoC容器管理的Bean。
     * - ServletRegistrationBean是Spring Boot提供的一个Servlet注册类。它可以用于将Servlet注册到应用中，该类实例化后，可获得相关Servlet实例。
     * - new StatViewServlet()是我们要注册的Servlet，即Druid的监控页面Servlet。
     * - "/druid/*"是为该Servlet指定URL映射。
     * - Map<String,String>用于保存Druid监控页面的登录用户名和密码。
     * - servletRegistrationBean.setInitParameters(map);用于将Druid监控页面的登录用户名和密码添加至servletRegistrationBean实例中。
     * - 最后返回servletRegistrationBean实例。
     * 所以，这段代码的作用就是将Druid监控页面注册到Spring Boot应用中，
     * 并且设置了登录用户名和密码，方便我们在使用Druid时进行监控和管理。
     *
     * @return 将Druid监控页面注册到Spring Boot应用
     */
    @Bean
    public ServletRegistrationBean<Servlet> druidServlet() {
        ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>(
                new StatViewServlet(),
                "/druid/*"
        );
        Map<String, String> map = new HashMap<>();
        map.put("loginUsername", loginUsername);
        map.put("loginPassword", loginPassword);
        servletRegistrationBean.setInitParameters(map);
        return servletRegistrationBean;
    }

    /**
     * 这段代码用于集成Druid的过滤器(Filter)到Spring Boot应用中，具体来说：
     * - @Bean是一个注解，用于标识该方法返回一个由Spring IoC容器管理的Bean。
     * - FilterRegistrationBean是Spring Boot提供的一个Filter注册类。它可以用于将Filter注册到应用中，该类实例化后，可获得相关Filter实例。
     * - new WebStatFilter()是我们要注册的Filter，即Druid的Web统计功能Filter。
     * - filterFilterRegistrationBean.addInitParameter()用于设置Filter的初始化参数，这里为Druid的Web统计功能Filter设置了要排除的URL路径。
     * - filterFilterRegistrationBean.addUrlPatterns()用于为Filter指定URL映射，这里将Filter应用于所有URL路径。
     * - 最后返回filterFilterRegistrationBean实例。
     * 因此，这段代码的作用是将Druid的Web统计功能Filter注册到Spring Boot应用中，
     * 并设置了要排除的URL路径。在使用Druid时可以对Web统计功能进行监控和管理。
     *
     * @return 将Druid的Web统计功能Filter注册到Spring Boot应用
     */
    @Bean
    public FilterRegistrationBean<Filter> druidFilter() {
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>(
                new WebStatFilter()
        );
        filterFilterRegistrationBean.addInitParameter(
                "exclusions",
                "*.js,*.css,*.jpg,*.png,*.gif"
        );
        filterFilterRegistrationBean.addUrlPatterns("/*");
        return filterFilterRegistrationBean;
    }
}
